package servlets;

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.Properties;
import java.util.Set;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 本例中列举了ServletContext接口中的一些常用方法的使用，请直接访问本Servlet即可看到运行结果。
 * @author Steven Suo
 *
 */
@WebServlet("/context.view")
public class ContextServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ContextServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		//获取ServletContext对象，每个Web应用只有一个ServletContext对象
		//当Web应用启动的时候Web容器会创建这个ServletContext对象，而当服务器停止时才销毁此对象。
		ServletContext context = request.getServletContext();
		//用ServletContext对象获取Web.xml文件中设置的初始化参数
		out.println("<p><Strong>获取web.xml文件中设置的初始化参数:</Strong> "+context.getInitParameter("WebName"));
		out.println("<br>");
		//从ServletContext对象中取出保存的对象，并强制转换为对应的对象
		Integer count = (Integer)context.getAttribute("counter");
		if (count == null) {
			count = 1;
		}else{
			count++;
		}
		//向ServletContext对象中保存对象
		context.setAttribute("counter", count);
		out.println("<p><Strong>ServletContext对象用于网页访问计数器：</Strong>本页面被访问了"+count+"次</p>");
		//输出ContextPath
		out.println("<p><Strong>获取ContextPath根目录： </Strong>"+context.getContextPath()+"</p>");
		//输出Web项目中某个目录的绝对路径，比如下面就输出了项目根目录在服务器上的绝对路径
		out.println("<p><Strong>用于获取项目根目录在服务器上的绝对路径:  </Strong>"+context.getRealPath("/")+"</p>");
		//输出Web项目中某个目录的绝对路径，比如下面就输出了项目WEB-INF目录在服务器上的绝对路径
		out.println("<p><Strong>项目WEB-INF目录在服务器上的绝对路径:  </Strong>"+context.getRealPath("/WEB-INF/")+"</p>");
		//获取指定目录下的子目录名与文件名，下面就是获取了WEB-INF目录下的子目录名和文件名
		out.println("<p><Strong>WEB-INF目录下的子目录名和文件名: </Strong></p>");
		Set<String> paths = context.getResourcePaths("/WEB-INF/");
		for (String path : paths) {
			out.println(path);
			out.println("<br>");
		}
		out.println("<p><Strong>ServletContext对象用指定资源创建输入流:</Strong></p>");
		//以指定目录下的指定资源创建输入流，下面的例子是用来读取Propertites文件
		InputStream inputStream = context.getResourceAsStream("/WEB-INF/classes/db.properties");
		Properties properties = new Properties();
		properties.load(inputStream);
		out.println(properties.getProperty("url"));
		out.close();
		
	}

}
